/**
 * 路由主入口文件
 */
const Router = require('koa-router');
const router = new Router();
const db = require('../db');

// 服务状态端点
router.get('/', async (ctx) => {
  ctx.body = {
    success: true,
    message: '小程序API服务已启动',
    status: 'running',
    version: '1.0.0',
    timestamp: new Date().toISOString()
  };
});

// 埋点测试接口 - 增加数据库写入功能
router.post('/api/weblog/track', async (ctx) => {
  try {
    const { events, deviceInfo } = ctx.request.body;
    
    if (!events || !Array.isArray(events) || events.length === 0) {
      ctx.body = {
        code: 400,
        message: '无效的埋点数据'
      };
      return;
    }
    
    console.log('📊 收到埋点数据:', events.length, '条事件');
    console.log('埋点数据详情:', JSON.stringify(ctx.request.body, null, 2));
    
    // 获取设备信息字符串
    const deviceInfoStr = deviceInfo ? JSON.stringify(deviceInfo) : null;
    
    // 定义有效的事件类型
    const validEventTypes = ['view', 'click', 'favorite', 'rate', 'complete', 'purchase'];
    
    // 处理每个事件，写入数据库
    const insertPromises = events.map(async (event) => {
      const {
        user_id,
        event_type,
        timestamp,
        course_id,
        extra_data
      } = event;
      
      // 检查事件类型是否有效
      if (!validEventTypes.includes(event_type)) {
        console.warn(`⚠️ 跳过无效的事件类型: ${event_type} (不在允许的枚举值范围内)`);
        return false;
      }
      
      // 处理时间戳格式 - 将ISO格式转为MySQL格式
      let formattedTimestamp;
      try {
        if (timestamp) {
          // 从ISO 8601格式转换为MySQL timestamp格式
          formattedTimestamp = new Date(timestamp).toISOString().slice(0, 19).replace('T', ' ');
        } else {
          formattedTimestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');
        }
      } catch (error) {
        console.error(`❌ 时间戳格式转换失败:`, error.message);
        formattedTimestamp = null; // 让数据库使用默认值
      }
      
      // 获取实际的课程ID，优先使用主字段，如果主字段为空检查extra_data中的值
      let actualCourseId = course_id;
      
      // 如果主字段为空，尝试从extra_data中提取
      if (!actualCourseId && extra_data) {
        // 检查extra_data中是否有course_id字段
        if (extra_data.course_id) {
          actualCourseId = extra_data.course_id;
          console.log(`⚠️ 从extra_data中提取course_id: ${actualCourseId}`);
        }
        
        // 检查page_params中是否有course_id (常见于view事件)
        else if (extra_data.page_params && extra_data.page_params.course_id) {
          actualCourseId = extra_data.page_params.course_id;
          console.log(`⚠️ 从page_params中提取course_id: ${actualCourseId}`);
        }
      }
      
      // 确保课程ID是数字类型
      if (actualCourseId && !isNaN(parseInt(actualCourseId))) {
        actualCourseId = parseInt(actualCourseId);
      } else if (actualCourseId) {
        console.warn(`⚠️ 无效的课程ID格式: ${actualCourseId}，设置为null`);
        actualCourseId = null;
      }
      
      // 确保额外数据是字符串
      const extraDataStr = extra_data ? JSON.stringify(extra_data) : null;
      
      try {
        try {
          // 先尝试包含device_info的方式
          await db.executeQuery(
            `INSERT INTO user_behaviors 
             (user_id, event_type, timestamp, course_id, extra_data, device_info) 
             VALUES (?, ?, ?, ?, ?, ?)`,
            [user_id, event_type, formattedTimestamp, actualCourseId, extraDataStr, deviceInfoStr]
          );
          console.log(`✅ 埋点数据写入成功: ${event_type} (user_id: ${user_id}, course_id: ${actualCourseId || 'NULL'})`);
        } catch (error) {
          if (error.code === 'ER_BAD_FIELD_ERROR') {
            // 如果字段不存在，使用不包含device_info的插入方式
            await db.executeQuery(
              `INSERT INTO user_behaviors 
               (user_id, event_type, timestamp, course_id, extra_data) 
               VALUES (?, ?, ?, ?, ?)`,
              [user_id, event_type, formattedTimestamp, actualCourseId, extraDataStr]
            );
            console.log(`✅ 埋点数据写入成功(无设备信息): ${event_type} (user_id: ${user_id}, course_id: ${actualCourseId || 'NULL'})`);
          } else {
            throw error; // 其他错误则继续抛出
          }
        }
        return true;
      } catch (err) {
        console.error(`❌ 埋点数据写入失败:`, err.message);
        return false;
      }
    });
    
    // 等待所有写入完成
    const results = await Promise.all(insertPromises);
    const successCount = results.filter(r => r).length;
    
    ctx.body = {
      code: 200,
      message: `成功记录 ${successCount}/${events.length} 条埋点数据`,
      success: successCount,
      total: events.length
    };
  } catch (err) {
    console.error('处理埋点数据失败:', err);
    ctx.body = {
      code: 500,
      message: '服务器内部错误',
      error: err.message
    };
  }
});

module.exports = router;